package Maze;//走迷宫
//        题目描述
//
//给定一个 N×MN×M 的网格迷宫 GG。GG 的每个格子要么是道路，要么是障碍物（道路用 11 表示，障碍物用 00 表示）。
//
//已知迷宫的入口位置为 (x1,y1)(x1​,y1​)，出口位置为 (x2,y2)(x2​,y2​)。问从入口走到出口，最少要走多少个格子。
//输入描述
//
//输入第 11 行包含两个正整数 N,MN,M，分别表示迷宫的大小。
//
//接下来输入一个 N×MN×M 的矩阵。若 Gi,j=1Gi,j​=1 表示其为道路，否则表示其为障碍物。
//
//        最后一行输入四个整数 x1,y1,x2,y2x1​,y1​,x2​,y2​，表示入口的位置和出口的位置。
//
//        1≤N,M≤1021≤N,M≤102，0≤Gi,j≤10≤Gi,j​≤1，1≤x1,x2≤N1≤x1​,x2​≤N，1≤y1,y2≤M1≤y1​,y2​≤M。
//输出描述
//
//输出仅一行，包含一个整数表示答案。
//
//若无法从入口到出口，则输出 −1−1。
//输入输出样例
//示例 1
//
//输入
//
//5 5
//        1 0 1 1 0
//        1 1 0 1 1
//        0 1 0 1 1
//        1 1 1 1 1
//        1 0 0 0 1
//        1 1 5 5
//        [copy]
//
//输出
//
//8

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;
public class MazeBfs {
    static int[] dx = {0, 1, 0, -1};
    static int[] dy = {1, 0, -1, 0};
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int[][] map = new int[n + 2][m + 2];
        int[][] isFlag = new int[n + 2][m + 2];
        for (int[] ints : map) {
            Arrays.fill(ints, 0);
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                int input = scanner.nextInt();
                map[i][j] = input;
            }
        }
        int x1 = scanner.nextInt();
        int x2 = scanner.nextInt();
        int y1 = scanner.nextInt();
        int y2 = scanner.nextInt();
        print(map);
        node start = new node(x1, x2, 0);
        Bfs(map, isFlag, y1, y2, start);
    }
    public static void Bfs(int[][] map, int[][] isFlag, int y1, int y2, node start) {
        int count = 0;
        LinkedList<node> linkedList = new LinkedList<>();
        linkedList.offer(start);
        isFlag[start.getX()][start.getY()] = 1;
        while (!linkedList.isEmpty()) {
            node peek = linkedList.peek();
            int x = peek.getX();
            int y = peek.getY();
            if (x == y1 && y == y2) {
                print(isFlag);
                count=1;
                System.out.println(peek.getStep());
                break;
            }
            for (int i = 0; i <= 3; i++) {
                int tx = x + dx[i];
                int ty = y + dy[i];
                if (map[tx][ty] != 0 && isFlag[tx][ty] != 1) {
                    node temp = new node(tx, ty, peek.step + 1);
                    isFlag[tx][ty] = 1;
                    linkedList.offer(temp);
                }
            }
            linkedList.poll();
        }
        if (count==0){
            System.out.println(-1);
        }
    }
    static class node {
        int x;
        int y;
        int step;

        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }
        public int getStep() {
            return step;
        }
        public node(int x, int y, int step) {
            this.x = x;
            this.y = y;
            this.step = step;
        }
    }

    private static void print(int[][] map) {
        System.out.println("====");
        for (int[] line : map) {
            System.out.println(Arrays.toString(line));
        }
        System.out.println("====");
    }
}
